//
//  XLStatus.swift
//  XLVeibo
//
//  Created by macbook on 16/6/27.
//  Copyright © 2016年 buWangChuXing. All rights reserved.
//

import UIKit

class XLStatus: NSObject {
    
    // 微博内容使用的富文本
    var textAttr: NSMutableAttributedString?

    /// 微博创建时间
    var created_at: String?
    

    //微博时间
    var vbTime:String?{
    
        return getWbTimeStr(created_at ?? "")
    }
    /// 微博ID
    var id: Int64 = 0
    /// 微博信息内容
    var text: String?{
        
        didSet{
            
            textAttr = getWeiBoAttr(text ?? "")
        }
    }

    /// 微博来源
    var source: String?{
        didSet{
        
            sourceAttr = getSourceStr(source)
            
        }
    }
      
    //  微博来源
    var sourceAttr: NSMutableAttributedString?
    //用户信息
    var user:XLUser?
    
    //转发微博
    var retweeted_status:XLStatus?
    
    //	int	转发数
    var reposts_count:Int = 0{
    
        didSet{
        
         repostsStr = getCountString(reposts_count, title: "转发")
        }
    }
    //	int	转发数
    var repostsStr: String?
    
    //	int	评论数
    var comments_count:Int = 0{
    
        didSet{
        
            commentsStr = getCountString(comments_count, title: "评论")

        }
    }
    
    
    //	int	评论数
    var commentsStr: String?
    
    //赞
    //	int	表态数
    var attitudes_count:Int = 0{
    
        didSet{
        
            attitudesStr = getCountString(attitudes_count, title: "赞")
        }
    }
    
    var attitudesStr : String?
    
    // MARK: -  配图数组
    var pic_urls:[XLPictureInfo]?
    
    //KVC构造函数
    init(dict:[String:AnyObject]) {
        
        super.init()
        setValuesForKeysWithDictionary(dict)
    }
    
    //防止出错
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
        
    }
    
    
    
    // MARK: - 重写set var for key 完成user的字典转模型
    override func setValue(value: AnyObject?, forKey key: String) {
        
        if key == "user" {
            
            //判断值是否存在，是否可以转成字典
            guard let v = value as? [String:AnyObject] else {
            
                return
            }
            
            //字典转模型
            let u = XLUser(dict: v)
            //对user赋值
            user = u
            
        }else if key == "retweeted_status"
        {
            guard let k = value as?[String:AnyObject] else
            {
                return
            }
            
            //转发微博字典转模型
            let s = XLStatus(dict: k)
            
            //给转发模型赋值
            retweeted_status = s
            
            //配图数组
        }else if key == "pic_urls"
        {
            guard let k = value as? [[String:AnyObject]] else
            {
                return
            }
            
            //创建一个可变数组
            var arrM:[XLPictureInfo] = [XLPictureInfo]()
            
            for dict in k {
            
                //字典转模型
                let p = XLPictureInfo(dict: dict)
                
                arrM.append(p)
              }
            //对pic_urls赋值
            pic_urls = arrM
            
        }
        
        else
        {
            //如果重写了set value for key 我们还需要系统帮助我们通过kvc字典转模型，需要重写父类
            super.setValue(value, forKey: key)

        }
    }
    
    
    //toolbar添加信息的方法
    func getCountString(count:Int,title:String)->String{
    
        if count <= 0 {
            
            return title
        }else if count > 0 && count < 10000
        {
            return"\(count)"
        }else
        {
            let countF = CGFloat(count / 10000) / 10
            var countStr = "\(countF)"
            
            //判断字符串是符包含.0
            if countStr.containsString(".0") {
                
                //如果包含.0,就添加一个空的字符串
                countStr = countStr.stringByReplacingOccurrencesOfString(".0", withString: "")
            }
            return "\(countStr)万"
        }
    }
    
    
    /*
     Optional("<a href=\"http://weibo.com/\" rel=\"nofollow\">微博 weibo.com</a>")
     Optional("<a href=\"http://app.weibo.com/t/feed/3auC5p\" rel=\"nofollow\">皮皮时光机</a>")
     Optional("<a href=\"http://app.weibo.com/t/feed/3auC5p\" rel=\"nofollow\">皮皮时光机</a>")
     */
    // 字符串的截取
    
//     处理微博来源字符串  注意返回的问题
    func getSourceStr(source: String?) -> NSMutableAttributedString{
        // 判断可选值是否有值 而且是否包含"> 字符串
        guard let s = source where s.containsString("\">")  else {
            let r = "来自 那遥远的地方"
            return getSourceAttr(r)
        }
        // 字符串的截取
        let start = s.rangeOfString("\">")!
        let end = s.rangeOfString("</a")!
        // 字符串截取
        let result = s.substringWithRange(start.endIndex..<end.startIndex)
        // 完成字符串拼接
        let r = "来自 \(result)"
        return getSourceAttr(r)
    }
    // 通过字符串生成富文本
    func getSourceAttr(result: String) -> NSMutableAttributedString{
        // 实例化一个富文本
        let attr = NSMutableAttributedString(string: result)
        // 获取range
        let range = (result as NSString).rangeOfString("来自")
        // 设置属性
        attr.addAttributes([NSForegroundColorAttributeName: ThemeColor], range: range)
        return attr
    }
    
    
    
    /*
     - 微博时间业务逻辑需求
     - 如果是今年
     - 如果是今天
     -  如果小于60秒 显示格式: 刚刚
     -  如果 s>=60 && s < 60 * 60  显示格式:xx分钟前
     -  如果 s>= 60*60  显示格式: xx小时前
     - 如果是昨天
     -  2016-06-29 12:12:12  显示格式: 昨天 12:12
     - 如果是其他
     -  2016-06-12 13:13:13  显示格式: 06月12日 13:13
     - 如果不是今年
     - 2015-05-05 10:10:10 显示格式: 2015年05月05日 10:10
     */
    
    //处理微博时间
    func getWbTimeStr(creatAt:String)->String{
        
        //时间格式
        let df = NSDateFormatter()
        //格式 Thu Jun 30 11:21:04 +0800 2016    ---- +0800 时区 z
        df.dateFormat = "EEE MMM dd HH:mm:ss z yyy"
        //设置地区
        df.locale = NSLocale(localeIdentifier: "en_US")
        
        //微博时间
        let wbDate = df.dateFromString(creatAt)!
        //判断今年
        let isThisYear:Bool = getWBIsThisYear(wbDate)
        
        //今年
        if isThisYear {
            
            //日历类
            let calendar = NSCalendar.currentCalendar()
            //如果是今天
            if calendar.isDateInToday(wbDate) {
                
                //秒数差值
                let s = NSDate().timeIntervalSinceDate(wbDate)
                if s < 60 {
                    
                    return "刚刚"
                }else if s >= 60 && s < 60 * 60 {
                    
                    //显示格式
                    return "\(Int(s/60))分钟前"
                    
                }else{
                    
                    return "\(Int(s/3600))小时前"
                }
                
                
            }else if calendar.isDateInYesterday(wbDate){
                //昨天显示格式 昨天 12:12
                
                df.dateFormat = "昨天 HH:mm"
                return df.stringFromDate(wbDate)
            }else{
                
                //其他 显示格式  06月12日 13:13
                df.dateFormat = "MM月dd日 HH:mm"
                return df.stringFromDate(wbDate)
                
            }
        }else{
            
            //不是今年显示格式: 2015年05月05日 10:10
            df.dateFormat = "yyyy年MM月dd日 HH:mm"
            let result = df.stringFromDate(wbDate)
            
            return result
        }
        
    }
    
    
    //判断是否是今年
    func getWBIsThisYear(wbDate:NSDate)->Bool{
        
        let df = NSDateFormatter()
        //设置地区
        df.locale = NSLocale(localeIdentifier: "en_US")
        
        //格式
        df.dateFormat = "yyyy"
        //微博时间
        let wbTime = df.stringFromDate(wbDate)
        //当前时间
        let currentTime = df.stringFromDate(NSDate())
        //代表今年
        if wbTime == currentTime {
            
            return true
        }else
        {
            return false
        }
        
    }
}


extension XLStatus{

    /*
     
     aaa[马到成功]aaa  最终显示在cell上 aaa表情aaa
     
     aaaa[嘿嘿]bbbb[笑笑] range loc=4 len=4     笑笑  range  loc = 12  len 4
     正序行不同 //aaaa表bbbb[笑笑]
     
     倒序 aaaa[嘿嘿]bbbb表
     */
    
    func getWeiBoAttr(text:String) -> NSMutableAttributedString{
    
        //富文本
        let resultAttr = NSMutableAttributedString(string: text)
        //定义一个保存模型的数组
        var matchArray:[XLMatchResult] = [XLMatchResult]()
        
        //通过正则表达式匹配结果
        (text as NSString).enumerateStringsMatchedByRegex("\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\") { (count, string, range, _) in
            
            //转模型博存数组
            let matchRes = XLMatchResult(string: (string.memory as! String), range: range.memory)
            // 保存数据
            matchArray.append(matchRes)
        }
        // 倒序遍历
        for match in matchArray.reverse() {
            let emoticon = XLEmoticonShardTools.shardTools.getSearchEmoticon(match.string)
            

            // 文本附件
            let att = NSTextAttachment()
            let path = emoticon?.path ?? ""
            let png = emoticon?.png ?? ""
            let name = path + png
            // 设置image
            att.image = UIImage(named: name, inBundle: XLEmoticonShardTools.shardTools.emoticonBundle, compatibleWithTraitCollection: nil)
            // 行高
            let lineHeight = UIFont.systemFontOfSize(15).lineHeight
            // 设置bounds
            att.bounds = CGRect(x: 0, y: -4, width: lineHeight, height: lineHeight)
            
            let attr = NSAttributedString(attachment: att)
            resultAttr.replaceCharactersInRange(match.range, withAttributedString: attr)
        }
        
        return resultAttr

    }

    
    
}





















